package leetcode.simple.q136;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args) {
        int[] nums = {2, 2, 1};
        int[] nums2 = {4,1,2,1,2};
        int i = singleNumber2(nums2);
        System.out.println(i);

    }

    /**
     * 我的题解1
     * @param nums
     * @return
     */
    public static int singleNumber(int[] nums) {
        //[2,2,1]
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            Integer count = map.getOrDefault(nums[i], 0);
            if (count == 0){
                map.put(nums[i], 1);
            }else {
                count++;
                map.put(nums[i], count);
            }
        }

        for (Integer n : map.keySet()) {
            if (map.get(n) == 1){
                return n;
            }
        }
        return 0;
    }

    /**
     * 我的题解2
     * @param nums
     * @return
     */
    public static int singleNumber2(int[] nums) {
        //如果数组长度为1，直接返回该元素
        if (nums.length == 1){
            return nums[0];
        }

        //数组排序
        Arrays.sort(nums);

        //如果第一个元素与第二个元素不相等，返回第一个元素
        if (nums[0] != nums[1]){
            return nums[0];
        }

        //如果最后一个元素与倒数第二个元素不相等，返回最后一个元素
        if (nums[nums.length-1] != nums[nums.length-2]){
            return nums[nums.length-1];
        }

        //循环遍历数组，从第2个元素开始，到倒数第2个元素结束，
        // 如果遍历到当前元素与前后的元素不相等，则返回当前元素
        for (int i = 1; i < nums.length - 1; i++) {
            if (nums[i] != nums[i-1] && nums[i] != nums[i+1]){
                return nums[i];
            }
        }
        return 0;
    }
}
